package home

import (
	"github.com/gin-gonic/gin"

	"github.com/zeromicro/go-zero/tools/goctl/example/api/internal/domain"
	"github.com/zeromicro/go-zero/tools/goctl/example/api/internal/logic"
	"github.com/zeromicro/go-zero/tools/goctl/example/api/internal/svc"
	"github.com/zeromicro/go-zero/tools/goctl/example/api/pkg/httpx"
)

type Gst struct {
	svcCtx *svc.ServiceContext
	gst    logic.Gst
}

func NewGst(svcCtx *svc.ServiceContext, gst logic.Gst) *Gst {
	return &Gst{
		svcCtx: svcCtx,
		gst:    gst,
	}
}

func (h *Gst) InitRegister(engine *gin.Engine) {
	g := engine.Group("v1/gst")
	g.POST("", h.Create)
	g.GET("/list", h.List)
	g.GET("/info", h.Info)
	g.POST("/del", h.Del)
	g.POST("/baseinfo", h.CreateBaseInfo)
	g.GET("/baseinfo", h.BaseInfos)
	g.POST("/baseinfo/del", h.DelBaseinfo)
	g.POST("/line", h.CreateLine)
	g.GET("/line/info", h.InfoLine)
	g.POST("/line/del", h.DelLine)
	g.POST("/linedetails", h.CreateLineDetails)
	g.GET("/linedetails/info", h.LineDetailsInfo)
	g.POST("/lineDetails/del", h.DelLineDetails)
	g.POST("/content", h.CreateContents)
	g.POST("/content/del", h.DelContent)
	g.POST("/weltanschauung", h.CreateWeltanschauung)
	g.POST("/weltanschauung/del", h.DelWeltanschauung)
	g.GET("/weltanschauung/list", h.ListWeltanschauung)
	g.GET("/weltanschauung/info", h.InfoWeltanschauung)
	g.GET("/prompts", h.GetPrompts)
	g.GET("/tags", h.Tags)
}

// 创建/修改小说的基本信息
func (h *Gst) Create(ctx *gin.Context) {
	var req domain.GstReq
	if err := httpx.BindAndValidate(ctx, &req); err != nil {
		httpx.FailWithErr(ctx, err)
		return
	}

	res, err := h.gst.Create(ctx.Request.Context(), &req)
	if err != nil {
		httpx.FailWithErr(ctx, err)
	} else {
		httpx.OkWithData(ctx, res)
	}
}

func (h *Gst) List(ctx *gin.Context) {
	var req domain.GstInfoReq
	if err := httpx.BindAndValidate(ctx, &req); err != nil {
		httpx.FailWithErr(ctx, err)
		return
	}

	res, err := h.gst.List(ctx.Request.Context(), &req)
	if err != nil {
		httpx.FailWithErr(ctx, err)
	} else {
		httpx.OkWithData(ctx, res)
	}
}

func (h *Gst) Info(ctx *gin.Context) {
	var req domain.GstInfoReq
	if err := httpx.BindAndValidate(ctx, &req); err != nil {
		httpx.FailWithErr(ctx, err)
		return
	}

	res, err := h.gst.Info(ctx.Request.Context(), &req)
	if err != nil {
		httpx.FailWithErr(ctx, err)
	} else {
		httpx.OkWithData(ctx, res)
	}
}

func (h *Gst) Del(ctx *gin.Context) {
	var req domain.IdReq
	if err := httpx.BindAndValidate(ctx, &req); err != nil {
		httpx.FailWithErr(ctx, err)
		return
	}

	err := h.gst.Del(ctx.Request.Context(), &req)
	if err != nil {
		httpx.FailWithErr(ctx, err)
	} else {
		httpx.Ok(ctx)
	}
}

// 创建/修改小说的某一小节的基本信息
func (h *Gst) CreateBaseInfo(ctx *gin.Context) {
	var req domain.GstBaseInfoReq
	if err := httpx.BindAndValidate(ctx, &req); err != nil {
		httpx.FailWithErr(ctx, err)
		return
	}

	res, err := h.gst.CreateBaseInfo(ctx.Request.Context(), &req)
	if err != nil {
		httpx.FailWithErr(ctx, err)
	} else {
		httpx.OkWithData(ctx, res)
	}
}

func (h *Gst) BaseInfos(ctx *gin.Context) {
	var req domain.GstInfoReq
	if err := httpx.BindAndValidate(ctx, &req); err != nil {
		httpx.FailWithErr(ctx, err)
		return
	}

	res, err := h.gst.BaseInfos(ctx.Request.Context(), &req)
	if err != nil {
		httpx.FailWithErr(ctx, err)
	} else {
		httpx.OkWithData(ctx, res)
	}
}

func (h *Gst) DelBaseinfo(ctx *gin.Context) {
	var req domain.IdReq
	if err := httpx.BindAndValidate(ctx, &req); err != nil {
		httpx.FailWithErr(ctx, err)
		return
	}

	err := h.gst.DelBaseinfo(ctx.Request.Context(), &req)
	if err != nil {
		httpx.FailWithErr(ctx, err)
	} else {
		httpx.Ok(ctx)
	}
}

// 创建/修改小说的某小结对应的故事路线
func (h *Gst) CreateLine(ctx *gin.Context) {
	var req domain.GstLineReq
	if err := httpx.BindAndValidate(ctx, &req); err != nil {
		httpx.FailWithErr(ctx, err)
		return
	}

	res, err := h.gst.CreateLine(ctx.Request.Context(), &req)
	if err != nil {
		httpx.FailWithErr(ctx, err)
	} else {
		httpx.OkWithData(ctx, res)
	}
}

func (h *Gst) InfoLine(ctx *gin.Context) {
	var req domain.GstInfoReq
	if err := httpx.BindAndValidate(ctx, &req); err != nil {
		httpx.FailWithErr(ctx, err)
		return
	}

	res, err := h.gst.InfoLine(ctx.Request.Context(), &req)
	if err != nil {
		httpx.FailWithErr(ctx, err)
	} else {
		httpx.OkWithData(ctx, res)
	}
}

func (h *Gst) DelLine(ctx *gin.Context) {
	var req domain.IdReq
	if err := httpx.BindAndValidate(ctx, &req); err != nil {
		httpx.FailWithErr(ctx, err)
		return
	}

	err := h.gst.DelLine(ctx.Request.Context(), &req)
	if err != nil {
		httpx.FailWithErr(ctx, err)
	} else {
		httpx.Ok(ctx)
	}
}

// 创建/修改小说的某小结对应的里面的某一处细节
func (h *Gst) CreateLineDetails(ctx *gin.Context) {
	var req domain.GstLineDetailsReq
	if err := httpx.BindAndValidate(ctx, &req); err != nil {
		httpx.FailWithErr(ctx, err)
		return
	}

	res, err := h.gst.CreateLineDetails(ctx.Request.Context(), &req)
	if err != nil {
		httpx.FailWithErr(ctx, err)
	} else {
		httpx.OkWithData(ctx, res)
	}
}

func (h *Gst) LineDetailsInfo(ctx *gin.Context) {
	var req domain.GstInfoReq
	if err := httpx.BindAndValidate(ctx, &req); err != nil {
		httpx.FailWithErr(ctx, err)
		return
	}

	res, err := h.gst.LineDetailsInfo(ctx.Request.Context(), &req)
	if err != nil {
		httpx.FailWithErr(ctx, err)
	} else {
		httpx.OkWithData(ctx, res)
	}
}

func (h *Gst) DelLineDetails(ctx *gin.Context) {
	var req domain.IdReq
	if err := httpx.BindAndValidate(ctx, &req); err != nil {
		httpx.FailWithErr(ctx, err)
		return
	}

	err := h.gst.DelLineDetails(ctx.Request.Context(), &req)
	if err != nil {
		httpx.FailWithErr(ctx, err)
	} else {
		httpx.Ok(ctx)
	}
}

// 创建/修改小说的某小结对应的里面的具体章节内容
func (h *Gst) CreateContents(ctx *gin.Context) {
	var req domain.GstContentsRep
	if err := httpx.BindAndValidate(ctx, &req); err != nil {
		httpx.FailWithErr(ctx, err)
		return
	}

	res, err := h.gst.CreateContents(ctx.Request.Context(), &req)
	if err != nil {
		httpx.FailWithErr(ctx, err)
	} else {
		httpx.OkWithData(ctx, res)
	}
}

func (h *Gst) DelContent(ctx *gin.Context) {
	var req domain.IdReq
	if err := httpx.BindAndValidate(ctx, &req); err != nil {
		httpx.FailWithErr(ctx, err)
		return
	}

	err := h.gst.DelContent(ctx.Request.Context(), &req)
	if err != nil {
		httpx.FailWithErr(ctx, err)
	} else {
		httpx.Ok(ctx)
	}
}

// 创建/修改小说的某小结对应的世界观
func (h *Gst) CreateWeltanschauung(ctx *gin.Context) {
	var req domain.GstWeltanschauungReq
	if err := httpx.BindAndValidate(ctx, &req); err != nil {
		httpx.FailWithErr(ctx, err)
		return
	}

	res, err := h.gst.CreateWeltanschauung(ctx.Request.Context(), &req)
	if err != nil {
		httpx.FailWithErr(ctx, err)
	} else {
		httpx.OkWithData(ctx, res)
	}
}

// 删除小说的某小结对应的世界观
func (h *Gst) DelWeltanschauung(ctx *gin.Context) {
	var req domain.IdReq
	if err := httpx.BindAndValidate(ctx, &req); err != nil {
		httpx.FailWithErr(ctx, err)
		return
	}

	err := h.gst.DelWeltanschauung(ctx.Request.Context(), &req)
	if err != nil {
		httpx.FailWithErr(ctx, err)
	} else {
		httpx.Ok(ctx)
	}
}

func (h *Gst) ListWeltanschauung(ctx *gin.Context) {
	var req domain.GstInfoReq
	if err := httpx.BindAndValidate(ctx, &req); err != nil {
		httpx.FailWithErr(ctx, err)
		return
	}

	res, err := h.gst.ListWeltanschauung(ctx.Request.Context(), &req)
	if err != nil {
		httpx.FailWithErr(ctx, err)
	} else {
		httpx.OkWithData(ctx, res)
	}
}

func (h *Gst) InfoWeltanschauung(ctx *gin.Context) {
	var req domain.GstInfoReq
	if err := httpx.BindAndValidate(ctx, &req); err != nil {
		httpx.FailWithErr(ctx, err)
		return
	}

	res, err := h.gst.InfoWeltanschauung(ctx.Request.Context(), &req)
	if err != nil {
		httpx.FailWithErr(ctx, err)
	} else {
		httpx.OkWithData(ctx, res)
	}
}

// 获取小说的提示词
func (h *Gst) GetPrompts(ctx *gin.Context) {
	var req domain.GetPromptsReq
	if err := httpx.BindAndValidate(ctx, &req); err != nil {
		httpx.FailWithErr(ctx, err)
		return
	}

	res, err := h.gst.GetPrompts(ctx.Request.Context(), &req)
	if err != nil {
		httpx.FailWithErr(ctx, err)
	} else {
		httpx.OkWithData(ctx, res)
	}
}

func (h *Gst) Tags(ctx *gin.Context) {
	res, err := h.gst.Tags(ctx.Request.Context())
	if err != nil {
		httpx.FailWithErr(ctx, err)
	} else {
		httpx.OkWithData(ctx, res)
	}
}
